#ifndef __LK_STACK_H__
#define __LK_STACK_H__

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

//类型的声明
//假设栈中的元素类型是int 
typedef int Elemtype;

//节点类型
typedef struct node 
{
    Elemtype data;  //数据域,存储用户数据
    struct node *next;  //指针域,存储下一个节点的地址
    struct node *prev;  //指针域,存储上一个节点的地址
}Node;

//"栈"类型(管理链表的,第一个节点地址,最后一个节点地址,节点数量)
typedef struct LKstack
{
    Node *first;   //第一个数据节点的地址
    Node *last;    //最后一个数据节点的地址
    int num;        //链表中的元素个数
} LKstack;



//函数的声明

/*
InitStack:初始化一个空栈,分配一个栈
返回值:返回一个初始化好的栈的地址
*/
LKstack *InitStack();

/*
DestoryStack:销毁一个栈
@s:指向你要销毁的栈
返回值:无
*/
void DestoryStack(LKstack *s);

/*
ClearStack:清空一个栈
@s:指向你要清空的栈
返回值:无
*/
void ClearStack(LKstack *s);

/*
StackIsEmpty:判断栈是否为空(是否存在用户数据)
@s:指向你要操作的栈
返回值:
    如果栈为空,返回真  true 
    如果栈为非空,返回假  false
*/
bool StackIsEmpty(LKstack *s);

/*
StackSize:获取栈的大小(用户元素的个数)
@s:指向你要操作的栈
返回值:栈中的元素个数
*/
int StackSize(LKstack *s);

/*
GetTop:获取栈顶元素,但是不出栈
@s:指向你要操作的栈
@v:指向一个可用的空间,用来保存获取到的栈顶元素
返回值:表示获取成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool GetTop(LKstack *s,Elemtype *v);


/*
Push:入栈,把一个用户数据存放到栈中去
@s:指向你要操作的栈
@e:你要入栈的元素
返回值:表示入栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Push(LKstack *s,Elemtype e);


/*
Pop:出栈,把一个用户数据从栈中拿出来
@s:指向你要操作的栈
返回值:表示出栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Pop(LKstack *s);


#endif 